import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase Escenario Inicializa los objetos necesario para el su uso durante el juego y los menus.
 * 
 * @author (Programacion Orientada A Objetos - Gonzalez Donat - Neri Andriano) 
 * @version (15/05/12)
 */
public class Escenario extends World
{
    private Mono mono;  //Variable en la cual se crea al mono
    private Cronometro crono; //Variable que sirve para crear el cronometro
    private Contador vidas; //Variable que crea el contador de las vidas
    private Lampara lamp;   //Variable que contiene a la lampara
    private int nivel;  //Variable que contiene el nivel en el que se encuentra el juego
    private Portal portal;  //Variable que crea el portal
    private Menu titulo;    //Variable que contiene Menu que mostrara el titulo
    private Menu menu;  //Variable que contiene Menu que sera el boton juego
    private Menu menu2; //Variable que contiene Menu que sera el boton intrucciones
    private Menu menu3; //Variable que contiene Menu que sera el boton credito
    private GreenfootImage fondo;   //
    private GreenfootImage fondo2;  //
    private Menu instruc1;  //Variable que contiene Menu que mostrara las instrucciones parte 1
    private Menu instruc2;  //Variable que contiene Menu que mostrara las instrucciones parte 2
    private Menu credito;   //Variable que contiene Menu que mostrara los Creditos
    private Menu botonsig;  //Variable que contiene Menu que mostrara el botòn Siguiente
    private Menu botonatr;  //Variable que contiene Menu que mostrara el botòn Atras
    private Menu botonregmenu;  //Variable que contiene Menu que mostrara el boton de regreso al menu
    /**
     * Constructor para objectos de la clase Escenario.
     */
    public Escenario()
    {    
        super(800, 600, 1); 
        Greenfoot.setSpeed(44);
        mono = new Mono();
        crono = new Cronometro();
        vidas = new Contador(String.valueOf(mono.regresaVidas()));
        lamp = new Lampara(mono);
        portal = new Portal (mono);
        menu = new Menu(0);
        menu2 = new Menu(1);
        menu3 = new Menu(2);
        fondo = new GreenfootImage("notebook_sheet.jpg");
        fondo2 = new GreenfootImage("fondogris.bmp");
        instruc1 = new Menu(3);
        instruc2 = new Menu(4);
        botonsig = new Menu(5);
        botonatr = new Menu(6);
        titulo = new Menu(9);
        botonregmenu = new Menu(7);
        credito = new Menu(8);
        this.cambiaEscenario(4);
        
    }

    /**
     * Añade los objetos necesarios y en su posicion para el menu.
     */
    private void menuIni()
    {
        this.setBackground(fondo);
        addObject(titulo,400,80);
        addObject(menu, 400, 146+50);
        addObject(menu2, 400, 276+50);
        addObject(menu3, 400, 385+50);

    }
    
    /**
     * Añade los objetos necesarios y en su posicion para el nivel 1.
     */
    private void prepare1()
    {
        this.setBackground(fondo2);
        MaderaCorta maderacorta = new MaderaCorta(mono);
        addObject(maderacorta, 220, 421);
        PiedraLarga piedralarga = new PiedraLarga(mono);
        addObject(piedralarga, 641, 76);
        PastoLargo pastolargo = new PastoLargo(mono);
        addObject(pastolargo, 281, 223);
        MaderaLarga maderalarga = new MaderaLarga(mono);
        addObject(maderalarga, 587, 262);
        MaderaCorta maderacorta2 = new MaderaCorta(true, mono);
        addObject(maderacorta2, 458, 384);
        maderacorta2.setLocation(408, 312);
        Debil debil = new Debil(mono, 5);
        addObject(debil, 333, 400);
        debil.setLocation(326, 384);
        Tuberia tuberia = new Tuberia(true, mono, 3);
        addObject(tuberia, 447, 89);
        tuberia.setLocation(463, 122);
        MaderaLarga maderalarga2 = new MaderaLarga(mono);
        addObject(maderalarga2, 495, 483);
        PiedraLarga piedralarga2 = new PiedraLarga(mono);
        addObject(piedralarga2, 139, 590);
        PastoCorto pastocorto = new PastoCorto(true, mono);
        addObject(pastocorto, 333, 531);
        Goma goma = new Goma(mono);
        addObject(goma, 150, 481);
        goma.setLocation(133, 516);
        Tuberia tuberia2 = new Tuberia(mono, 3);
        addObject(tuberia2, 224, 505);
        PastoCorto pastocorto2 = new PastoCorto(mono);
        addObject(pastocorto2, 99, 501);
        goma.setLocation(132, 524);
        MaderaCorta maderacorta3 = new MaderaCorta(false, mono);
        addObject(maderacorta3, 58, 445);
        maderacorta3.setLocation(42, 444);
        Debil debil2 = new Debil(mono, 5);
        addObject(debil2, 129, 448);
        tuberia.setLocation(469, 132);
        pastocorto.setLocation(318, 551);
        maderalarga2.setLocation(494, 508);
        Escalera escalera = new Escalera(mono);
        addObject(escalera, 561, 430);
        maderalarga2.setLocation(494, 504);
        PiedraLarga piedralarga3 = new PiedraLarga(mono);
        addObject(piedralarga3, 681, 372);
        piedralarga3.setLocation(667, 384);
        escalera.setLocation(526, 423);
        Ventilador ventilador = new Ventilador(1, mono);
        addObject(ventilador, 563, 491);
        Trampolin trampolin = new Trampolin(mono);
        addObject(trampolin, 743, 374);
        Cuchillas cuchillas = new Cuchillas(mono);
        addObject(cuchillas, 615, 255);
        Escalera escalera2 = new Escalera(mono);
        addObject(escalera2, 741, 246);
        addObject(portal, 740, 50);
        addObject(mono, 20, 570);
        addObject(lamp,20,570);
        crono.inicializa();
        addObject(crono,70,20);
        addObject(vidas,750,20);
    }
    
    /**
     * Añade los objetos necesarios y en su posicion para el nivel 3.
     */
    private void prepare3()
    {

        PastoLargo pastolargo = new PastoLargo(mono);
        PastoLargo pastolargo2 = new PastoLargo(mono);
        PiedraLarga piedralarga = new PiedraLarga(mono);        
        PiedraLarga piedralarga2 = new PiedraLarga(mono);
        PiedraLarga piedralarga3 = new PiedraLarga(mono);
        PiedraLarga piedralarga4 = new PiedraLarga(mono);
        MaderaLarga maderalarga = new MaderaLarga(mono);
        MaderaLarga maderalarga2 = new MaderaLarga(mono);
        PiedraCorta piedracorta = new PiedraCorta(true, mono);

        addObject(pastolargo, 380, 394);
        addObject(pastolargo2, 430, 492);
        addObject(piedralarga, 126, 594);
        addObject(piedralarga2, 397, 594);
        addObject(maderalarga, 475, 227);
        addObject(maderalarga2, 248, 313);
        addObject(piedralarga3, 667, 594);     
        addObject(piedracorta, 719, 544);
        addObject(piedralarga4, 532, 528);

        PiedraLarga piedralarga5 = new PiedraLarga(mono);
        addObject(piedralarga5, 359, 424);
        PiedraLarga piedralarga6 = new PiedraLarga(mono);
        addObject(piedralarga6, 604, 312);
        PiedraLarga piedralarga7 = new PiedraLarga(mono);
        addObject(piedralarga7, 399, 159);
        PiedraLarga piedralarga8 = new PiedraLarga(mono);
        addObject(piedralarga8, 223, 252);
        PiedraLarga piedralarga9 = new PiedraLarga(mono);
        addObject(piedralarga9, 524, 273);
        MaderaLarga maderalarga3 = new MaderaLarga(mono);
        addObject(maderalarga3, 262, 122);
        MaderaLarga maderalarga4 = new MaderaLarga(mono);
        addObject(maderalarga4, 598, 153);
        MaderaLarga maderalarga5 = new MaderaLarga(mono);
        addObject(maderalarga5, 160, 418);
        MaderaLarga maderalarga6 = new MaderaLarga(mono);
        addObject(maderalarga6, 572, 367);
        PastoLargo pastolargo3 = new PastoLargo(mono);
        addObject(pastolargo3, 306, 84);
        PastoLargo pastolargo4 = new PastoLargo(mono);
        addObject(pastolargo4, 169, 537);
        PastoLargo pastolargo5 = new PastoLargo(mono);
        addObject(pastolargo5, 584, 448);
        PiedraCorta piedracorta2 = new PiedraCorta(true, mono);
        addObject(piedracorta2, 267, 361);
        PiedraCorta piedracorta3 = new PiedraCorta(false, mono);
        addObject(piedracorta3, 668, 198);
        piedracorta3.setLocation(121, 537);
        pastolargo4.setLocation(398, 396);
        piedracorta3.setLocation(265, 493);
        piedralarga4.setLocation(522, 529);
        pastolargo2.setLocation(577, 253);
        piedracorta3.setLocation(356, 486);
        piedralarga5.setLocation(546, 404);
        piedracorta3.setLocation(351, 486);
        pastolargo4.setLocation(531, 190);
        piedralarga5.setLocation(527, 419);
        pastolargo5.setLocation(554, 479);
        piedralarga5.setLocation(671, 432);
        pastolargo.setLocation(627, 342);
        maderalarga5.setLocation(173, 441);
        piedracorta2.setLocation(117, 389);
        maderalarga2.setLocation(295, 340);
        piedralarga8.setLocation(135, 275);
        maderalarga6.setLocation(336, 386);
        maderalarga2.setLocation(299, 330);
        maderalarga2.setLocation(293, 342);
        maderalarga6.setLocation(322, 391);
        pastolargo.setLocation(639, 354);
        maderalarga6.setLocation(351, 392);
        pastolargo.setLocation(636, 357);
        piedralarga9.setLocation(227, 215);
        mono.setLocation(23, 551);
        pastolargo4.setLocation(136, 519);
        MaderaCorta maderacorta = new MaderaCorta(false, mono);
        addObject(maderacorta, 401, 289);
        maderacorta.setLocation(291, 296);
        maderacorta.setLocation(285, 292);
        piedralarga9.setLocation(32, 216);
        piedralarga7.setLocation(274, 165);
        maderalarga3.setLocation(100, 110);
        pastolargo3.setLocation(415, 101);
        PastoCorto pastocorto = new PastoCorto(true, mono);
        addObject(pastocorto, 624, 200);
        PastoCorto pastocorto2 = new PastoCorto(true, mono);
        addObject(pastocorto2, 639, 98);
        PastoCorto pastocorto3 = new PastoCorto(false, mono);
        addObject(pastocorto3, 476, 192);
        pastocorto3.setLocation(296, 214);
        pastolargo2.setLocation(477, 260);
        pastocorto3.setLocation(303, 215);
        piedralarga6.setLocation(614, 304);
        piedralarga6.setLocation(626, 305);
        pastolargo.setLocation(663, 356);
        piedralarga6.setLocation(638, 308);
        pastolargo.setLocation(667, 363);
        piedralarga6.setLocation(643, 314);
        pastolargo.setLocation(669, 367);
        piedralarga5.setLocation(678, 425);
        piedracorta.setLocation(759, 511);
        pastolargo5.setLocation(582, 476);
        piedracorta.setLocation(757, 516);
        piedralarga4.setLocation(543, 531);
        piedracorta3.setLocation(370, 486);
        maderalarga5.setLocation(198, 442);
        maderalarga5.setLocation(209, 467);
        piedracorta3.setLocation(383, 498);
        maderalarga5.setLocation(207, 459);
        pastolargo4.setLocation(131, 505);
        MaderaCorta maderacorta2 = new MaderaCorta(mono);
        addObject(maderacorta2, 296, 552);
        piedralarga7.setLocation(277, 155);
        maderalarga.setLocation(576, 216);
        PiedraCorta piedracorta4 = new PiedraCorta(true, mono);
        addObject(piedracorta4, 267, 137);
        piedracorta4.setLocation(290, 103);
        maderalarga3.setLocation(396, 8);
        pastolargo3.setLocation(469, 62);
        pastocorto2.setLocation(645, 19);
        maderalarga3.setLocation(427, 6);
        pastolargo3.setLocation(474, 58);
        PastoCorto pastocorto4 = new PastoCorto(mono);
        addObject(pastocorto4, 64, 119);
        MaderaCorta maderacorta3 = new MaderaCorta(mono);
        addObject(maderacorta3, 557, 124);
        PiedraCorta piedracorta5 = new PiedraCorta(mono);
        addObject(piedracorta5, 738, 97);
        piedralarga6.setLocation(609, 316);
        maderalarga.setLocation(524, 82);
        maderacorta3.setLocation(683, 215);
        maderalarga4.setLocation(493, 186);
        maderalarga4.setLocation(494, 170);
        maderalarga4.setLocation(494, 169);
        maderalarga.setLocation(577, 112);
        piedracorta5.setLocation(741, 98);
        Tuberia tuberia = new Tuberia(mono, 2);
        addObject(tuberia, 511, 220);
        tuberia.setLocation(455, 264);
        Tuberia tuberia2 = new Tuberia(mono, 1);
        addObject(tuberia2, 231, 14);
        tuberia2.setLocation(227, 8);
        Goma goma = new Goma(mono);
        addObject(goma, 51, 369);
        maderalarga2.setLocation(310, 341);
        piedracorta2.setLocation(137, 387);
        maderalarga5.setLocation(177, 450);
        piedracorta3.setLocation(359, 489);
        piedralarga4.setLocation(533, 533);
        pastolargo5.setLocation(589, 485);
        piedralarga4.setLocation(520, 529);
        maderacorta2.setLocation(282, 544);
        pastolargo4.setLocation(129, 502);
        maderacorta2.setLocation(283, 549);
        maderalarga5.setLocation(176, 441);
        maderacorta.setLocation(279, 283);
        maderalarga2.setLocation(313, 335);
        piedracorta2.setLocation(136, 382);
        maderalarga5.setLocation(179, 445);
        pastolargo4.setLocation(129, 488);
        pastolargo4.setLocation(129, 494);
        maderalarga5.setLocation(186, 446);
        piedracorta2.setLocation(139, 390);
        maderalarga2.setLocation(319, 339);
        maderacorta.setLocation(281, 287);
        maderacorta2.setLocation(275, 545);
        piedralarga4.setLocation(532, 533);
        pastolargo5.setLocation(595, 482);
        pastolargo5.setLocation(577, 479);
        maderalarga6.setLocation(360, 394);
        goma.setLocation(71, 324);
        Sierra sierra = new Sierra(mono, true, 1);
        addObject(sierra, 482, 466);
        Cuchillas cuchillas = new Cuchillas(mono);
        addObject(cuchillas, 694, 206);
        Trampolin trampolin = new Trampolin(mono);
        addObject(trampolin, 526, 472);
        Ventilador ventilador = new Ventilador(30, mono);
        addObject(ventilador, 648, 350);
        Escalera escalera = new Escalera(mono);
        addObject(escalera, 385, 198);
        maderalarga4.setLocation(528, 172);
        piedralarga7.setLocation(215, 154);
        escalera.setLocation(384, 191);
        pastocorto4.setLocation(66, 64);
        Trampolin trampolin2 = new Trampolin(mono);
        addObject(trampolin2, 55, 207);
        trampolin2.setLocation(51, 205);
        Sierra sierra2 = new Sierra(mono, false, 1);
        addObject(sierra2, 448, 53);
        sierra2.setLocation(441, 47);
        removeObject(tuberia2);
        Tuberia tuberia3 = new Tuberia(mono, 3);
        addObject(tuberia3, 229, 15);
        tuberia3.setLocation(227, 8);
        addObject(portal, 765, 75);
        addObject(mono,20,570);
        addObject(lamp,20,570);
        crono.inicializa();
        addObject(crono,70,20);
        addObject(vidas,750,20);
    }
    
    /**
     * Disminuye las vidas de el actor Mono y acutaliza el contador de vidas.
     */
    public void disminuyeVidas()
    {
        mono.quitaVida();
        vidas.actualizaCont(String.valueOf(mono.regresaVidas()));
        crono.modifCont();
    }

    /**
     * Elimina algun Actor
     */
    public void elimina(Actor a)
    {
        removeObject(a);
    }

    /**
     * Agrea un algun actor.
     */
    public void agrega(Actor a,int x, int y)
    {
        addObject(a,x,y);
    }

    /**
     * Modifica el nivel en el que se encuentra el juego
     * @param n es el valor que tomara el nivel.
     */
    public void modificaNivel(int n)
    {
        nivel=n;
    }

    /**
     * Regresa el valor del nivel en el que se encuentra el juego
     * @return regresa un entero el cual es el valor del nivel
     */
    public int dameNivel()
    {
        return nivel;
    }

    /**
     * Remueve todos los objetos que se encuentren en el mundo.
     */
    public void remove()
    {
        int aux;
        aux=getObjects(null).size();
        Actor a;
        for(int f=0;f<aux;f++){
            a = (Actor) getObjects(null).get(0);
            removeObject(a);  
        }
    }

    /**
     * Se encarga de limpiar y poner los objetos del mundo segun el escenario que se quiera poner
     * @param x Entero usado en el switch para elegir el escenario.
     */
    public void cambiaEscenario(int x)
    {
        switch(x)
        {
            case 0:this.remove();
            this.prepare1();
            break;
            case 1:this.remove();
            this.prepare2();
            break;
            case 2:this.remove();
            this.prepare3();
            break;
            case 3:this.remove();
            this.cambiaEscenario(nivel);
            break;
            case 4:nivel=0;
                    remove();
                   menuIni();
                   break;
        }
    }

    /**
     * Añade los objetos necesarios y en su posicion para el nivel 2.
     */
    private void prepare2()
    {

        PiedraLarga piedralarga = new PiedraLarga(mono);
        addObject(piedralarga, 140, 585);
        PiedraLarga piedralarga2 = new PiedraLarga(mono);
        addObject(piedralarga2, 417, 585);
        removeObject(piedralarga2);
        PiedraLarga piedralarga3 = new PiedraLarga(mono);
        addObject(piedralarga3, 406, 583);
        Sierra sierra = new Sierra(mono, true, 1);
        addObject(sierra, 373, 580);
        MaderaCorta maderacorta = new MaderaCorta(true, mono);
        addObject(maderacorta, 612, 547);
        MaderaCorta maderacorta2 = new MaderaCorta(true, mono);
        addObject(maderacorta2, 699, 459);
        PiedraCorta piedracorta = new PiedraCorta(mono);
        addObject(piedracorta, 67, 64);
        MaderaLarga maderalarga = new MaderaLarga(mono);
        addObject(maderalarga, 467, 490);
        PastoLargo pastolargo = new PastoLargo(mono);
        addObject(pastolargo, 167, 492);
        Escalera escalera = new Escalera(mono);
        addObject(escalera, 41, 417);
        escalera.setLocation(39, 404);
        PiedraLarga piedralarga5 = new PiedraLarga(mono);
        addObject(piedralarga5, 183, 433);
        MaderaLarga maderalarga2 = new MaderaLarga(mono);
        addObject(maderalarga2, 182, 364);
        Tuberia tuberia2 = new Tuberia(mono, 5);
        addObject(tuberia2, 320, 493);
        Goma goma = new Goma(mono);
        addObject(goma, 142, 285);
        MaderaCorta maderacorta3 = new MaderaCorta(true, mono);
        addObject(maderacorta3, 371, 393);
        maderacorta3.setLocation(366, 389);
        Debil debil = new Debil(mono, 4);
        addObject(debil, 14, 492);
        PastoCorto pastocorto = new PastoCorto(mono);
        addObject(pastocorto, 477, 346);
        pastocorto.setLocation(476, 346);
        maderacorta3.setLocation(362, 390);
        pastocorto.setLocation(473, 347);
        PastoLargo pastolargo2 = new PastoLargo(mono);
        addObject(pastolargo2, 674, 347);
        Cuchillas cuchillas = new Cuchillas(mono);
        addObject(cuchillas, 537, 336);
        PastoLargo pastolargo3 = new PastoLargo(mono);
        addObject(pastolargo3, 267, 65);
        PastoLargo pastolargo4 = new PastoLargo(mono);
        addObject(pastolargo4, 536, 65);
        PastoCorto pastocorto2 = new PastoCorto(mono);
        addObject(pastocorto2, 739, 258);
        Trampolin trampolin = new Trampolin(mono);
        addObject(trampolin, 763, 328);
        pastocorto2.setLocation(732, 247);
        PiedraLarga piedralarga6 = new PiedraLarga(mono);
        addObject(piedralarga6, 367, 247);
        Escalera escalera2 = new Escalera(mono);
        addObject(escalera2, 226, 278);
        Tuberia tuberia3 = new Tuberia(false, mono, 3);
        addObject(tuberia3, 615, 191);
        tuberia3.setLocation(620, 203);
        MaderaLarga maderalarga3 = new MaderaLarga(mono);
        addObject(maderalarga3, 446, 158);
        PastoCorto pastocorto3 = new PastoCorto(mono);
        addObject(pastocorto3, 154, 249);
        Sierra sierra2 = new Sierra(mono, true, 1);
        addObject(sierra2, 391, 240);
        Ventilador ventilador = new Ventilador(25, mono);
        addObject(ventilador, 439, 146);
        Trampolin trampolin2 = new Trampolin(mono);
        addObject(trampolin2, 292, 229);
        Goma goma2 = new Goma(mono);
        addObject(goma2, 775, 170);
        PastoCorto pastocorto4 = new PastoCorto(false, mono);
        addObject(pastocorto4, 213, 108);
        pastocorto4.setLocation(217, 110);
        Trampolin trampolin3 = new Trampolin(mono);
        addObject(trampolin3, 553, 142);
        addObject(portal,50,40);
        addObject(mono, 20, 560);
        addObject(lamp,20,570);
        crono.inicializa();
        addObject(crono,70,20);
        addObject(vidas,750,20);
    }

    /**
     * Remueve la lampara.
     */
    public void remueveLamp()
    {
        removeObject(lamp); 
    }
    
    /**
     * Añade los objetos necesarios y en su posicion para las 2 hojas de instrucciones.
     */
    public void instrucciones(int aux)
    {
        if(aux==0)
        {
            remove();
            addObject(instruc1,400,300);
            addObject(botonsig,750,572);
            addObject(botonregmenu,745,65);
        }
        if(aux==1)
        {
            remove();
            addObject(instruc2,400,300);
            addObject(botonatr,750,572);
            addObject(botonregmenu,745,65);
        }
    }
    
    /**
     * Añade los objetos necesarios y en su posicion para los Créditos.
     */
    public void poneCreditos()
    {
        remove();
        addObject(credito,400,300);
        addObject(botonregmenu,745,50);
    }
    
    /**
     *Este metodo se usa mas que nada para cuando el mono se queda sin piso y no hay manera de recuperarlo.
     */
    public void poneCeroCrono()
    {
        crono.modifBool();
    }
}
